package cn.demoncat.util.lang;

import java.util.Collection;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import cn.demoncat.util.exception.ParamRuntimeException;

/**
 * 描述：参数非空检测工具
 *
 * @author 延晓磊
 *
 * @since 2017年7月10日
 */
public final class ParamEmptyUtil {

	/**
	 * 断言 - 只要有1个false就抛异常
	 * 	 
	 * @param msg		错误消息
	 * @param checks	参数空校验表达式，参数非空时返回true
	 * 
	 * @exception ParamRuntimeException	有1个参数为false
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月21日
	 */
	public static void assertCheck(String msg, boolean ...checks){
		for (boolean check : checks) {
			if (!check) {
				throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
			}
		}
	}
	
	/**
	 * 断言 - 只要有1个false就抛异常
	 * 	 
	 * @param checks	参数空校验表达式，参数非空时返回true
	 * 
	 * @exception ParamRuntimeException	有1个参数为false
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月21日
	 */
	public static void check(boolean ...checks){
		assertCheck(null, checks);
	}
	
	/**
	 * 断言 - empty
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertBlank(String msg, String ...params) {
		if (isBlank(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - empty
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkBlank(String ...params) {
		assertBlank(null, params);
	}
 
	/**
	 * 断言 - empty
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertAllBlank(String msg, String ...params) {
		if (allBlank(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - empty
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkAllBlank(String ...params) {
		assertAllBlank(null, params);
	}
 
	/**
	 * 断言 - null/0
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/0
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertZero(String msg, Number ...params) {
		if (anyZero(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - null/0
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/0
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkZero(Number ...params) {
		assertZero(null, params);
	}
	
	/**
	 * 断言 - null/小于0
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/小于0
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertNegative(String msg, Number ...params) {
		if (anyNegative(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - null/小于0
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/小于0
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkNegative(Number ...params) {
		assertNegative(null, params);
	}
	
	/**
	 * 断言 - null/非正数
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数非正数
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertNotPositive(String msg, Number ...params) {
		if (anyNotPositive(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - null/非正数
	 * 
	 * @param params		错误消息
	 * 
	 * @exception ParamRuntimeException	有1个参数非正数
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkNotPositive(Number ...params) {
		assertNotPositive(null, params);
	}
	
	/**
	 * 断言 - Null
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为Null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertNull(String msg, Object ...params) {
		if (isNull(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - Null
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为Null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkNull(Object ...params) {
		assertNull(null, params);
	}
 
	/**
	 * 断言 - Null
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为Null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertAllNull(String msg, Object ...params) {
		if (allNull(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - Null
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为Null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkAllNull(Object ...params) {
		assertAllNull(null, params);
	}
	
	/**
	 * 断言 - null/empty
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertEmpty(String msg, Object ...params) {
		if (anyEmpty(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - null/empty
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	有1个参数为null/empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkEmpty(Object ...params) {
		assertEmpty(null, params);
	}
	
	/**
	 * 断言 - null/empty
	 * 
	 * @param msg		错误消息
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为null/empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void assertAllEmpty(String msg, Object ...params) {
		if (allEmpty(params)) {
			throw StringUtils.isBlank(msg) ? ParamRuntimeException.NULL : new ParamRuntimeException(msg);
		}
	}
	
	/**
	 * 断言 - null/empty
	 * 
	 * @param params	校验参数
	 * 
	 * @exception ParamRuntimeException	所有参数为null/empty
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月12日
	 */
	public static void checkAllEmpty(Object ...params) {
		assertAllEmpty(null, params);
	}
	
	/**
	 * 判断为Null：有1个为Null返回true，都非Null返回false
	 *
	 * @param os
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNull(Object... os) {
		if (os == null || os.length == 0) {
			return true;
		}
		for (Object o : os) {
			if (o == null) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断多个对象都为Null：有1个非Null返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allNull(Object ... os){
		return !isNotNull(os);
	}
	
	/**
	 * 判断非Null：有1个非Null返回true，都为Null返回false
	 *
	 * @param os
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNotNull(Object... os) {
		if (os == null || os.length == 0) {
			return false;
		}
		for (Object o : os) {
			if (o != null) {
				return true;
			}
		}
		return false;
	}
 
	/**
	 * 判断多个对象都非Null：有1个为Null返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allNotNull(Object ... os){
		return !isNull(os);
	}
	
	/**
	 * 判断为空：有1个为空返回true，都非空返回false
	 *
	 * @param os
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isBlank(String... os) {
		return StringUtils.isAnyBlank(os);
	}
	
	/**
	 * 判断多个字符串都为空：有1个非空返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allBlank(String ... os){
		return StringUtils.isAllBlank(os);
	}
	
	/**
	 * 判断非空：有1个非空返回true，都为空返回false
	 *
	 * @param os
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNotBlank(String... os) {
		return !allBlank(os);
	}
 
	/**
	 * 判断多个字符串都非空：有1个为空返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allNotBlank(String ... os){
		return !StringUtils.isAnyBlank(os);
	}
	
	/**
	 * 判断为空
	 *
	 * @param o
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isEmpty(Object o) {
		if (o == null) {
			return true;
		}
		//数字类型
		if (o instanceof Number) {
			return false;
		}
		//字符串类型
		if (o instanceof String) {
			return ((String)o).isEmpty();
		}
		//集合类型
		if (o instanceof Collection) {
			return ((Collection<?>)o).isEmpty();
		}
		//Map类型
		if (o instanceof Map<?,?>) {
			return ((Map<?,?>)o).isEmpty();
		}
		//数组类型
		if (o instanceof Object[]){
			return ((Object[])o).length == 0;
		}
		return false;
	}
	
	/**
	 * 判断为空：有1个为空返回true，都非空返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean anyEmpty(Object ...src) {
		if (src == null || src.length == 0) {
			return true;
		}
		//遍历
		for (Object o : src) {
			if (isEmpty(o)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断多个对象都为空：有1个非空返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allEmpty(Object ... os){
		return !anyNotEmpty(os);
	}
	
	/**
	 * 判断非空
	 *
	 * @param o
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNotEmpty(Object o) {
		return !isEmpty(o);
	}
	
	/**
	 * 判断非空：有1个非空返回true，都为空返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean anyNotEmpty(Object ...src) {
		if (src == null || src.length == 0) {
			return false;
		}
		//遍历
		for (Object o : src) {
			if (isNotEmpty(o)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断多个对象都非空：有1个为空返回false
	 * 
	 * @param os
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年7月10日
	 */
	public static boolean allNotEmpty(Object ... os){
		return !anyEmpty(os);
	}
	
	/**
	 * 判断为null或0
	 *
	 * @param num
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isZero(Number num) {
		return NumberUtil.isBlank(num);
	}
	
	/**
	 * 判断为null或0：有1个为空返回true，都非空返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean anyZero(Number... src) {
		if (src == null || src.length == 0) {
			return true;
		}
		for (Number number : src) {
			if (isZero(number)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断非null或0
	 *
	 * @param num
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean notZero(Number num) {
		return !isZero(num);
	}
	
	/**
	 * 判断非null或0：有1个为空返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean allNotZero(Number... src) {
		return !anyZero(src);
	}
	
	/**
	 * 判断为null或负数
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNegative(Number src) {
		return NumberUtil.isNegative(src);
	}
	
	/**
	 * 判断为null或负数：有1个为null或负数返回true，都非null或负数返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean anyNegative(Number... src) {
		if (src == null || src.length == 0) {
			return true;
		}
		for (Number number : src) {
			if (isNegative(number)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断非null或负数
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNotNegative(Number src) {
		return !isNegative(src);
	}
	
	/**
	 * 判断非null或负数：有1个为null或负数返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean allNotNegative(Number... src) {
		return !anyNegative(src);
	}
	
	/**
	 * 判断为正数
	 *
	 * @param number
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isPositive(Number number) {
		if (number == null) {
			return false;
		}
		return NumberUtil.isPositive(number);
	}
	
	/**
	 * 判断都为正数：有1个非正数返回false，都为正数返回true
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean allPositive(Number... src) {
		return !anyNotPositive(src);
	}
	
	/**
	 * 判断非正数
	 *
	 * @param number
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean isNotPositive(Number number) {
		return !isPositive(number);
	}
	
	/**
	 * 判断非正数：有1个非正数返回true，都为正数返回false
	 *
	 * @param src
	 * 
	 * @author 延晓磊
	 *
	 * @since 2016-12-9
	 */
	public static boolean anyNotPositive(Number... src) {
		if (src == null || src.length == 0) {
			return true;
		}
		for (Number number : src) {
			if (isNotPositive(number)) {
				return true;
			}
		}
		return false;
	}
	
}
